/*
 * @Author: Kiro AI Assistant
 * @Date: 2025-01-10
 * @Description: MusicApiService 使用示例
 */

import 'package:flutter/foundation.dart';
import '../services/music_api_service.dart';
import '../services/music_api_exception.dart';
import '../models/music_item_model.dart';

/// MusicApiService 使用示例
class ApiUsageExample {
  final MusicApiService _apiService = MusicApiService();

  /// 初始化API服务
  void initialize() {
    _apiService.initialize();
  }

  /// 搜索音乐示例
  Future<void> searchMusicExample() async {
    try {
      if (kDebugMode) {
        debugPrint('🔍 开始搜索音乐...');
      }

      // 搜索音乐
      final results = await _apiService.loadSearchData(
        keyword: '周杰伦',
        page: 1,
        sourceType: 'qq',
      );

      if (kDebugMode) {
        debugPrint('✅ 搜索完成，找到 ${results.length} 首歌曲');
        for (int i = 0; i < results.length && i < 5; i++) {
          final music = results[i];
          debugPrint('  ${i + 1}. ${music.title} - ${music.artist}');
        }
      }

      // 如果有搜索结果，尝试获取第一首歌的播放链接
      if (results.isNotEmpty) {
        await getPlayUrlExample(results.first);
      }
    } catch (error) {
      if (error is SearchException) {
        if (kDebugMode) {
          debugPrint('❌ 搜索失败: ${error.message}');
        }
      } else if (error is NetworkException) {
        if (kDebugMode) {
          debugPrint('❌ 网络错误: ${error.message}');
        }
      } else {
        if (kDebugMode) {
          debugPrint('❌ 未知错误: $error');
        }
      }
    }
  }

  /// 获取播放链接示例
  Future<void> getPlayUrlExample(MusicItemModel music) async {
    try {
      if (kDebugMode) {
        debugPrint('🎵 获取播放链接: ${music.title}');
      }

      final playUrl = await _apiService.loadStrapTrack(
        trackId: music.id,
        sourceType: 'qq',
      );

      if (kDebugMode) {
        if (playUrl.isNotEmpty) {
          debugPrint('✅ 获取播放链接成功: $playUrl');
        } else {
          debugPrint('⚠️ 播放链接为空');
        }
      }
    } catch (error) {
      if (error is PlayUrlException) {
        if (kDebugMode) {
          debugPrint('❌ 获取播放链接失败: ${error.message}');
        }
      } else if (error is NetworkException) {
        if (kDebugMode) {
          debugPrint('❌ 网络错误: ${error.message}');
        }
      } else {
        if (kDebugMode) {
          debugPrint('❌ 未知错误: $error');
        }
      }
    }
  }

  /// 网络连接检查示例
  Future<void> checkNetworkExample() async {
    try {
      if (kDebugMode) {
        debugPrint('🌐 检查网络连接...');
      }

      final isConnected = await _apiService.checkNetworkConnection();

      if (kDebugMode) {
        if (isConnected) {
          debugPrint('✅ 网络连接正常');
        } else {
          debugPrint('❌ 网络连接异常');
        }
      }
    } catch (error) {
      if (kDebugMode) {
        debugPrint('❌ 网络检查失败: $error');
      }
    }
  }

  /// 工具方法使用示例
  void utilityMethodsExample() {
    if (kDebugMode) {
      debugPrint('🛠️ 工具方法示例:');

      // 生成QQ音乐图片URL
      final albumImageUrl = MusicApiService.getQQImageUrl(
        qqImageId: '003fA5G40k6hKc',
        imageType: 'album',
      );
      debugPrint('专辑图片URL: $albumImageUrl');

      final artistImageUrl = MusicApiService.getQQImageUrl(
        qqImageId: '003fA5G40k6hKc',
        imageType: 'artist',
      );
      debugPrint('艺术家图片URL: $artistImageUrl');

      // 格式化时长
      const duration1 = Duration(minutes: 3, seconds: 45);
      final formatted1 = MusicApiService.formatMusicDuration(duration1);
      debugPrint('时长格式化 (3:45): $formatted1');

      const duration2 = Duration(hours: 1, minutes: 23, seconds: 45);
      final formatted2 = MusicApiService.formatMusicDuration(duration2);
      debugPrint('时长格式化 (1:23:45): $formatted2');
    }
  }

  /// 运行所有示例
  Future<void> runAllExamples() async {
    if (kDebugMode) {
      debugPrint('🚀 开始运行 MusicApiService 示例...');
    }

    // 初始化
    initialize();

    // 检查网络连接
    await checkNetworkExample();

    // 工具方法示例
    utilityMethodsExample();

    // 搜索音乐示例
    await searchMusicExample();

    if (kDebugMode) {
      debugPrint('✅ 所有示例运行完成');
    }
  }

  /// 清理资源
  void dispose() {
    _apiService.dispose();
  }
}
